#include "StdAfx.h"
#include "Carril.h"
#include <sstream>
using std::vector;

Carril::Carril(void)
{
}

Carril::~Carril(void)
{
}

vector<Punto*> Carril::getListaDePuntos()
{
	return listaDePuntos;
}

void Carril::setListaDePuntos(vector<Punto*> listPtos)
{
	this->listaDePuntos = listPtos;
}


void Carril::SetId(String valor){
	this->id = valor.tostring(valor.size());
}
String Carril::GetId(){
	return id;
}

string Carril::toString(){

	stringstream resultado;
	resultado << "Carril: " <<std::endl;
	
	for (int i=0; i < (int) this->listaDePuntos.size(); i++){

		Punto* puntoPtr  = this->listaDePuntos.at(i);
		resultado << "punto numero: " << i << " id: " << puntoPtr->GetId() <<std::endl;
	}

	return resultado.str();
}
void Carril::Dibujar(SDL_Surface *screen)
{
	float factorTramoSobrante=1.1;
	float anchoCarril= this->getFondo()->getImagen()->h;
	float largoCarril= this->getFondo()->getImagen()->w;
				
	Punto* puntoActual  = this->listaDePuntos.at(0);
	 	for (int i=1; i < (int) this->listaDePuntos.size(); i++){
			Punto* puntoSiguiente  = this->listaDePuntos.at(i);

			Textura *texturaTMP=this->getFondo()->Clone();

			double deltaX = (puntoSiguiente->getPosX() - puntoActual->getPosX());
			double deltaY = (puntoSiguiente->getPosY() - puntoActual->getPosY());
			
			SDL_Surface *Imagen = texturaTMP->getImagen();

			float largo= sqrt(pow(deltaX,2) + pow(deltaY,2));

			texturaTMP->cargar(largo, factorTramoSobrante*texturaTMP->getImagen()->h );

			double angulo=0;
			SDL_Rect pos;
			angulo=(180*(atan2(deltaY,deltaX)))/M_PI;
			float angRad=atan2(deltaY,deltaX);
			angulo=(180*(atan2(deltaY,deltaX)))/M_PI;
			if (angulo>89 && angulo<91){
						texturaTMP->rotar(90);
						pos.x=puntoActual->getPosX()-(largo/2)+anchoCarril/2;
						pos.y=puntoActual->getPosY();
						pos.w=largo;
						pos.h=largo;
						}else if (angulo< -88 && angulo > -92){
							texturaTMP->rotar(-90);
							pos.x=puntoActual->getPosX()-(largo/2);
							pos.y=puntoActual->getPosY()-(largo/2)+anchoCarril;
							pos.w=largo;
							pos.h=largo;
							}else if (angulo>178 && angulo < 182){
								texturaTMP->rotar(180);
								pos.x=puntoActual->getPosX()-(largo);
								pos.y=puntoActual->getPosY();
								pos.w=largo;
								pos.h=largo;
								}else if (angulo>-2 && angulo < 2){
									texturaTMP->rotar(0);
									pos.x=puntoActual->getPosX()+anchoCarril/2;
									pos.y=puntoActual->getPosY()-(texturaTMP->getImagen()->h/2)+anchoCarril/2;
									pos.w=largo;
									pos.h=largo;
									}else if (angulo>0){
										texturaTMP->rotar(angulo);
										pos.x=puntoActual->getPosX()-((largo/2)-((largo/2)*cos(atan2(deltaY,deltaX))));
										pos.y=puntoActual->getPosY()-((largo/2)-((largo/2)*sin(atan2(deltaY,deltaX))));
										pos.w=largo;
										pos.h=largo;
										}else if (angulo<0){
											texturaTMP->rotar(angulo);
											pos.x=puntoActual->getPosX()-((largo/2)-(largo/2)*cos(angRad));
											float corrimientoY = (largo/2-(largo/2)*sin(angRad));
											pos.y=puntoActual->getPosY()-corrimientoY;
											pos.w=largo;
											pos.h=largo;
											}
			
			
			texturaTMP->aplicarEnPosicion(screen,pos);
			puntoActual=puntoSiguiente;
		}

}